home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 4
/
FM Towns Free Software Collection 4 - Disc 1.iso
/
pao
/
towns
/
paolib
/
sample
/
vtc.c
< prev
next >
Wrap
Text File
|
1991-10-18
|
7KB
|
255 lines
/** << High C >> **************************************************************
**
** 割り込みテストプログラム
**
** < History >
** 1990.06.12 : CREATE
**
** < note > : TABS = 4
**
** Programmed by Y.Hirata ( Nifty ID : NAB03321 )
**
******************************************************************************/
pragma Off (Floating_point) ;
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <egb.h>
#include <snd.h>
#include <mos.h>
#include <fmc.h>
#include "hc.h"
#include "key.h"
long Icount ; /* カウンタ */
#define GworkSize 1536 /* グラフィック作業域のサイズ */
char Gwork[GworkSize] ; /* グラフィック作業域 */
#define SworkSize 16384 /* サウンド作業域のサイズ */
char Swork[SworkSize] ; /* サウンド作業域 */
#define MworkSize 4096 /* マウス作業域のサイズ */
char Mwork[MworkSize] ; /* マウス作業域 */
int X=0, Y=0, Bot ; /* マウス情報格納 */
/*************************** 割り込み Handler ******************************/
static int int_handler( void )
{
Icount ++ ;
return( 0 ) ;
}
/********************************* 初期化 **********************************/
void gsminit()
{
TEXT_init( Gwork,GworkSize ) ; /* EGB 初期化 */
GRP_viewport( 0,0,1023,511 ) ; /* View Port SET */
TEXT_cursor( TRUE ) ; /* カーソル表示 */
/*
** MOS_start() は、 SND_init() の後にすること。
*/
SND_init( Swork ) ; /* SND初期化 */
MOS_start( Mwork,MworkSize ) ; /* MOS初期化 */
MOS_disp( FALSE ) ; /* マウス非表示 */
}
/*************************** 割り込み用カンウタ値表示 **************************/
void loop( int func )
{
TEXT_color( C_WHITE ) ;
do {
MOS_rdpos( &Bot,&X,&Y ) ;
if ( Bot == MOS_LEFT ) {
TEXT_printf( " " ) ;
TEXT_printf( "MOUSE button : LEFT on <Icount:%ld>\n",Icount ) ;
} else if ( Bot == MOS_RIGHT ) {
TEXT_printf( " " ) ;
TEXT_printf( "MOUSE button : RIGHT on <Icount:%ld>\n",Icount ) ;
} else if ( Bot == MOS_BOTH ) {
TEXT_printf( " " ) ;
TEXT_printf( "MOUSE button : BOTH on <Icount:%ld>\n",Icount ) ;
break ;
}
switch ( func ) {
case 1 :
TEXT_printf( "FMC Timer : %ld\n",Icount ) ;
break ;
case 2 :
TEXT_printf( "VSYNC : %ld\n",Icount ) ;
break ;
case 3 :
TEXT_printf( "FM音源 タイマB : %ld\n",Icount ) ;
break ;
default :
TEXT_printf( "??? : %ld\n",Icount ) ;
}
} while ( Bot != MOS_BOTH ) ;
}
/************************* 割り込みテストプログラム ************************/
void main()
{
struct _ENCODE encode ;
union _MOJI moji ;
int func = 0 ;
unsigned timeno ;
int ret ;
char *ofptr ;
unsigned int secph, sec, min, hour ;
gsminit() ;
switch ( func ) {
case 1 :
case 2 :
case 3 :
Icount = 0 ;
TEXT_printf( "\nIcount = %ld\n",Icount ) ;
}
TEXT_color( C_HYELLOW ) ;
TEXT_printf( "割り込みテスト開始 :\n" ) ;
while ( TRUE ) {
TEXT_color( C_HGREEN ) ;
TEXT_printf( "\n試験したい割り込みを番号で選択して下さい。\n" ) ;
TEXT_color( C_WHITE ) ;
TEXT_printf( "<1>FMC TIMER, <2>VSYNC, <3>FM音源 タイマB <0>終了 ? " ) ;
TEXT_color( C_HWHITE ) ;
while ( TRUE ) {
moji.x = KYB_read( 0,(unsigned int *)&encode ) ;
if ( moji.hl.l >= '0' && moji.hl.l <= '3' ) {
func = moji.hl.l - '0' ;
TEXT_printf( "%c\n",moji.hl.l ) ;
break ;
}
}
if ( func == 0 ) {
TEXT_color( C_HGREEN ) ;
TEXT_printf( "\n割り込みテスト終了!\n" ) ;
break ;
} else if ( func == 1 ) {
/*
** FMC TIMER (インターバルタイマ)
*/
TEXT_color( C_HYELLOW ) ;
TEXT_printf( "\n< FMC TIMER 割り込み処理 >\n" ) ;
TIM_TIME timer ;
timer.mode = 0 ;
timer.inf = 0 ;
BSETCODEADR( (char *)&timer.adr,int_handler ) ;
timer.hcycle = 0x00 ;
timer.lcycle = 1 ; /* 10ms */
ret = TIM_settime( &timer, (int *)&timeno ) ;
TEXT_color( C_LIGHTBLUE ) ;
TEXT_printf( "Time_settime() = %xh, timeno=%xh\n",ret,timeno ) ;
KYB_clrbuf() ; /* バッファクリア */
TEXT_color( C_HGREEN ) ;
TEXT_printf( "\n何かキーを押して下さい。 \n" ) ;
TEXT_printf( "マウスのボタンを左右同時に押すと終了します。\n" ) ;
moji.x = KYB_read( 0,(unsigned int *)&encode ) ;
Icount = 0 ;
loop( func ) ;
ret = TIM_clrtime( timeno ) ;
TEXT_color( C_LIGHTBLUE ) ;
TEXT_printf( "TIM_clrtime() = %xh\n",ret ) ;
TEXT_printf( "FMC Timer <END!> : %ld\n",Icount ) ;
secph = Icount % 100 ;
sec = Icount / 100 ;
min = sec / 60 ;
hour = min / 60 ;
sec %= 60 ;
min %= 60 ;
TEXT_color( C_HYELLOW ) ;
TEXT_printf( "elaps time : %02d:%02d:%02d.%02d (Icount:%ld)\n",
hour,min,sec,secph,Icount ) ;
} else if ( func == 2 ) {
/*
** VSYNC
*/
TEXT_color( C_HYELLOW ) ;
TEXT_printf( "\n< VSYNC 割り込み処理 >\n" ) ;
VSYNC_entry = int_handler ;
VSYNC_init() ;
KYB_clrbuf() ; /* バッファクリア */
TEXT_color( C_HGREEN ) ;
TEXT_printf( "\n何かキーを押して下さい。 \n" ) ;
TEXT_printf( "マウスのボタンを左右同時に押すと終了します。\n" ) ;
moji.x = KYB_read( 0,(unsigned int *)&encode ) ;
Icount = 0 ;
loop( func ) ;
VSYNC_end() ;
TEXT_color( C_LIGHTBLUE ) ;
TEXT_printf( "VSYNC <END!> : %ld\n",Icount ) ;
secph = ((Icount%60)*1000) / 60 ;
/* 四捨五入 */
if ( secph % 10 < 5 )
secph /= 10 ;
else
secph = secph / 10 + 1 ;
sec = Icount / 60 ;
min = sec / 60 ;
hour = min / 60 ;
sec %= 60 ;
min %= 60 ;
TEXT_color( C_HYELLOW ) ;
TEXT_printf( "elaps time : %02d:%02d:%02d.%02d (Icount:%ld)\n",
hour,min,sec,secph,Icount ) ;
} else if ( func == 3 ) {
/*
** FM音源タイマB
*/
TEXT_color( C_HYELLOW ) ;
TEXT_printf( "\n< FM音源タイマB 割り込み処理 >\n" ) ;
ofptr = (char *)SND_int_timer_b_get() ;
SND_elevol_mute( 0x3 ) ;
SND_int_timer_b_set( (char *)int_handler ) ;
KYB_clrbuf() ; /* バッファクリア */
TEXT_color( C_HGREEN ) ;
TEXT_printf( "\n何かキーを押して下さい。 \n" ) ;
TEXT_printf( "マウスのボタンを左右同時に押すと終了します。\n" ) ;
moji.x = KYB_read( 0,(unsigned int *)&encode ) ;
Icount = 0 ;
loop( func ) ;
SND_int_timer_b_set( ofptr ) ; /* Restore Timer B */
TEXT_color( C_LIGHTBLUE ) ;
TEXT_printf( "FM音源タイマB <END!> : %ld\n",Icount ) ;
secph = Icount % 100 ;
sec = Icount / 100 ;
min = sec / 60 ;
hour = min / 60 ;
sec %= 60 ;
min %= 60 ;
TEXT_color( C_HYELLOW ) ;
TEXT_printf( "elaps time : %02d:%02d:%02d.%02d (Icount:%ld)\n",
hour,min,sec,secph,Icount ) ;
}
}
MOS_end() ;
SND_end() ;
KYB_clrbuf() ; /* バッファクリア */
TEXT_color( C_HGREEN ) ;
TEXT_printf( "\n何かキーを押して下さい。 " ) ;
moji.x = KYB_read( 0,(unsigned int *)&encode ) ;
/*
** コンソール画面に戻す
*/
EGB_init( Gwork,GworkSize ) ; /* ゴミを消すため EGB 初期化 */
EGB_clearScreen( Gwork ) ;
coninit() ;
}